package 行为型模式.命令模式;

/**
 * 主要组成部分
 * Command (命令)
 * 声明执行操作的接口
 * ConcreteCommand (具体命令)
 * 将一个接收者对象绑定于一个动作
 * 调用接收者相应的操作，以实现Execute
 * Client (客户端)
 * 创建具体命令对象并设定它的接收者
 * Invoker (调用者)
 * 要求该命令执行这个请求
 * Receiver (接收者)
 * 知道如何实施与执行一个请求相关的操作
 */

interface ISwitch
{
	void execute();
	void undo();
}

class Tv
{
	void on()
	{
		System.out.println("开机");
	}
	
	void off()
	{
		System.out.println("关机");
	}
}

class TvCommand implements ISwitch
{
	private Tv tv;

	TvCommand(Tv tv) {
		this.tv = tv;
	}

	@Override
	public void execute() {
		System.out.println("命令开始");
		tv.on();
	}

	@Override
	public void undo() {
		tv.off();
		System.out.println("命令结束");
	}
}

class RemoteControl
{
	private TvCommand tvCommand;

	RemoteControl(TvCommand tvCommand) {
		this.tvCommand = tvCommand;
	}
	
	void on()
	{
		tvCommand.execute();		
	}
	
	void off()
	{
		tvCommand.undo();
	}
}

public class Command 
{
	public static void main(String[] args) 
	{
		RemoteControl remoteControl = new RemoteControl(new TvCommand(new Tv()));
		remoteControl.on();
		remoteControl.off();
	}
}
